package fr.uparis10.miage.m1p1.employes;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import fr.uparis10.miage.m1p1.core.Employe;
import fr.uparis10.miage.m1p1.core.Projet;

public class Ingenieur extends Employe {
	private ArrayList<Projet> pListe = new ArrayList<Projet>();
	private ArrayList<String> langageListe = new ArrayList<String>();

	/* Constructors - START */
	/**
	 * Constructeur par d�faut.
	 * Allocation de la liste de projets et de langages.
	 */
	public Ingenieur()
	{
		super();
	}
	
	public Ingenieur(int preferedEmplId, long preferedNumSS) {
		super(preferedEmplId, preferedNumSS);		
	}
	
	public Ingenieur(int preferedEmplId, long preferedNumSS, Date joinDate) {
		super(preferedEmplId, preferedNumSS, joinDate);		
	}
	/* Constructors - END */
	
	/**
	 * Recherche si un des langages du projet est connu par l'ing�nieur.
	 * @param lListe
	 * @return True: Si connu, False: Si non connu.
	 */
	public boolean estConnu(ArrayList<String> lListe){
		Iterator<String> iterLangInge = langageListe.iterator();
		Iterator<String> iterLangProjet = lListe.iterator();
		for(String langProjet = null; iterLangProjet.hasNext();){
			langProjet = iterLangProjet.next();
			for(String langInge = null; iterLangInge.hasNext();){
				langInge = iterLangInge.next();
				if(langInge.equals(langProjet)){
					return true;
				}	
			}					
		}
		return false;
	}
	
	/**
	 * Permet de calculer le bonus de salaire.
	 */
	public int calcBonus() {
		double bonusRate;
		switch(indice){
		   case A: bonusRate = 0.08; break;
		   case B: bonusRate = 0.05; break;
		   default: bonusRate = 0;
		}
		double bonus = salaire * bonusRate;
		return (int)bonus;
	}

	/* Getters & Setters definition - START */
	/**
	 * Retourne la liste des projets affect�s � l'ing�nieur.
	 */
	public ArrayList<Projet> getProjets(){
		assert(pListe.size() != 0);
		return pListe;
	}
	
	/**
	 * Retourne la liste des langages coonus par l'ing�nieur.
	 */
	public ArrayList<String> getLangages(){
		assert(langageListe.size() != 0);
		return langageListe;
	}
	
	/**
	 * Affecte un projet � l'ing�nieur si un des langages est connu
	 * et s'il ne poss�de pas plus de deux projets.
	 * @param p
	 */
	public void setProjet(Projet p){
		assert(estConnu(p.getLangagedvlpmt()) && (pListe.size() < 2));
		pListe.add(p);
		// well, the Project "wants" to know the list of his employees
		p.addEmploye(this);
	}
	
	/**
	 * Permet l'abandon d'un des projets affect� � l'ing�nieur.
	 * @param p
	 */
	public void abandonnerProjet(Projet p){
		pListe.remove(p);
		// end of work for this project
		p.removeEmploye(this);
	}
	
	/**
	 * Affecte un langage � l'ing�nieur.
	 * @param lang
	 */
	public void setLangage(String lang){
		langageListe.add(lang);
	}

	/* Getters & Setters definition - END */
	
}
